home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 7 / Gekikoh Dennoh Club Vol. 7 (Japan).7z / Gekikoh Dennoh Club Vol. 7 (Japan) (Track 01).bin / games / otoko / source.lzh / FuncEnemy / sword.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-06-14  |  4.7 KB  |  221 lines

  1. /* 剣みたいに長い敵 */
  2. #include <xsp2lib.h>
  3.  
  4. #include "../otoko.h"
  5. #include "../player.h"
  6. #include "../enemy.h"
  7. #include "../eshot.h"
  8. #include "../effect.h"
  9. #include "../priority.h"
  10. #include "../sound.h"
  11. #include "../psearch.h"
  12. #include "../entry.h"
  13.  
  14.  
  15. #define PALET_MAIN    0x0200
  16. #define HP_0    350
  17.  
  18. #define wabs(x) ((x) >= 0 ? (short) (x) : (short) -(x))
  19.  
  20. #define ENTRY_CONTROL_ADD    10    /* entry_control に足す値 */
  21.  
  22. enum {
  23.     APPEAR_LEFT = 0, APPEAR_RIGHT
  24. };
  25.  
  26. static short EnemyMoveSword (ENEMY *);
  27. static void EnemyTiniSword (ENEMY *);
  28.  
  29.  
  30. void EnemyInitSword (ENEMY * p)
  31. {
  32.     if (SHORT_LX < 144)
  33.         p->cwork = APPEAR_LEFT;
  34.     else
  35.         p->cwork = APPEAR_RIGHT;
  36.     p->vx = 0;
  37.     p->vy = 2 * 65536;
  38.     p->hit_px = 28;
  39.     p->hit_py = 16;
  40.     p->hit_sx = 48;
  41.     p->hit_sy = 16;
  42.     p->hit_cx = 6;
  43.     p->damage = 0;
  44.     p->flash = 0;
  45.     p->hp = HP_0;
  46.     p->pt = obj_sword;
  47.     p->seq = 0;
  48.     p->core_pt = sp_core01;
  49.     p->core_info = PALET_CORE_BLUE | PRIORITY_BOSS;
  50.     p->func_enemy_move = EnemyMoveSword;
  51.     p->func_enemy_tini = EnemyTiniSword;
  52.  
  53.     entry_control += ENTRY_CONTROL_ADD;
  54. }
  55.  
  56.  
  57.  
  58. static short EnemyMoveSword (ENEMY * p)
  59. {
  60.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  61.     p->x = (p->lx += p->vx) >> 16;
  62.     p->y = (p->ly += p->vy) >> 16;
  63.  
  64.     switch (p->seq) {
  65.  
  66.     case 0:
  67.         if (p->y > 16)
  68.             p->seq++;
  69.         break;
  70.  
  71.     case 1:
  72.         if (SHORT_VY > -1)
  73.             p->vy -= 4096;
  74.         else
  75.             p->seq++;
  76.         break;
  77.  
  78.         /* カバー開く */
  79.     case 2:
  80.         p->pt++;
  81.         if (p->pt >= obj_sword + 24) {    /* カバー開ききったら */
  82.             p->seq++;
  83.             SoundSetSE (SE_LOCK);
  84.             p->m_work = 0;
  85.             p->s_work = p->s_work2 = p->s_work3 = 0;
  86.         }
  87.         break;
  88.  
  89.     case 3:
  90.         /* 移動処理 */
  91. #define SPEED_3        2048    /* X方向加速度 */
  92. #define SPEED_3N    12    /* 加速度を足す回数 */
  93. #define SPEED_3S    150    /* これを超えたら減速開始 */
  94.         if (p->m_work++ < SPEED_3N) {
  95.             if (p->cwork == APPEAR_LEFT)
  96.                 p->vx += SPEED_3;
  97.             else
  98.                 p->vx -= SPEED_3;
  99.         }
  100.         if ((p->m_work > SPEED_3S) && (p->m_work < SPEED_3S + SPEED_3N + 1)) {
  101.             if (p->cwork == APPEAR_LEFT)
  102.                 p->vx -= SPEED_3;
  103.             else
  104.                 p->vx += SPEED_3;
  105.         }
  106.         if (p->m_work > SPEED_3S + SPEED_3N + 1) {
  107.             if (p->vy < 16384)
  108.                 p->vy += 4096;
  109.         }
  110.         /* 攻撃処理 */
  111.  
  112.         /* 通常弾 */
  113. #define INTERVAL3_1    14
  114. #define SPEED_SHOT3_1    12
  115.         switch (p->s_work++) {
  116.         case INTERVAL3_1 * 1:
  117.         case INTERVAL3_1 * 2:
  118.         case INTERVAL3_1 * 3:
  119.             EshotInit (ESHOT_NRG04, p->x, p->y, SPEED_SHOT3_1, psearch (p->x, p->y), 0);
  120.             SoundSetSE (SE_ESHOT_M);    /* 敵ショット音 */
  121.             break;
  122.         case INTERVAL3_1 * 9:
  123.             p->s_work = 0;
  124.             break;
  125.         }
  126.  
  127.         /* 自機にある程度近付いたら攻撃する扇状弾 */
  128.         if ((p->s_work2 == 0) && (wabs (player->x - p->x) < 32) && (p->y + 64 < player->y)) {
  129.             p->s_work2++;
  130.             p->s_angle = 64 + 24;
  131.             p->s_angle2 = 64 - 24;
  132.         }
  133. #define INTERVAL3_2        9
  134. #define SPEED_SHOT3_2    8
  135.         if (p->s_work2) {
  136.             switch (p->s_work2++) {
  137.             case INTERVAL3_2 * 1:
  138.             case INTERVAL3_2 * 2:
  139.             case INTERVAL3_2 * 3:
  140.             case INTERVAL3_2 * 4:
  141.             case INTERVAL3_2 * 5:
  142.             case INTERVAL3_2 * 6:
  143.                 EshotInit (ESHOT_NRG02, p->x - 12, p->y - 8, SPEED_SHOT3_2, p->s_angle -= 6, 0);
  144.                 EshotInit (ESHOT_NRG02, p->x + 12, p->y - 8, SPEED_SHOT3_2, p->s_angle2 += 6, 0);
  145.                 SoundSetSE (SE_ESHOT);    /* 敵ショット音 */
  146.                 break;
  147.             case INTERVAL3_2 * 20:
  148.                 p->s_work2 = 0;
  149.                 break;
  150.             case 0:
  151.                 break;
  152.             }
  153.         }
  154.         if (SHORT_LY > 192)
  155.             p->seq++;
  156.         break;
  157.  
  158.         /* 撤退 */
  159.     case 4:
  160.         if (SHORT_VY < 1)
  161.             p->vy += 4096;
  162.         /* 画面外に出たら消去 */
  163.         if (SHORT_LY > 256 + 32 + 16)
  164.             return (-1);    /* 消去 */
  165.         break;
  166.     }
  167.  
  168.     /* 自機ショットに当たった時の処理 */
  169.     if (p->damage) {
  170.         if (p->damage_core) {
  171.             SoundSetSE (SE_CORE_DAMAGE);
  172.             p->info = PALET_RED | PRIORITY_BOSS;
  173.             p->damage_core = 0;
  174.         } else {
  175.             SoundSetSE (SE_DAMAGE);
  176.             p->info = PALET_DAMAGE | PRIORITY_BOSS;
  177.         }
  178.         if ((p->hp -= p->damage) <= 0) {
  179.             EffectInit (EFFECT_EXPL, 0, p->x, p->y);
  180.             SoundSetSE (SE_EXPL_M);    /* 中ボス爆発音 */
  181.             if (p->core_info == (PALET_CORE_RED | PRIORITY_BOSS))
  182.                 EffectInit (EFFECT_POINTS_RED, POINTS_2500, p->x, p->y);
  183.             else
  184.                 EffectInit (EFFECT_POINTS_BLUE, POINTS_1500, p->x, p->y);
  185.             if (disp_level == DISP_LEVEL_HIGH)
  186.                 EffectInit (EFFECT_HAHENMINI, 0, p->x, p->y);
  187.             return (-1);    /* 消去 */
  188.         }
  189.         p->damage = 0;
  190.         p->flash = TIMER_FLASH_DAMAGE;
  191.     } else {
  192.         if ((p->flash++ > TIMER_FLASH_RED) && (p->hp < 100)) {
  193.             p->info = PALET_RED | PRIORITY_BOSS;
  194.             if (p->flash > TIMER_FLASH_NORMAL)
  195.                 p->flash = 0;
  196.         } else {
  197.             p->info = PALET_MAIN | PRIORITY_BOSS;
  198.         }
  199.     }
  200.  
  201.     xobj_set_st (p);
  202.  
  203.     /* コアの表示 */
  204.     p->core_x = p->x - 8;    /* コアの中心は (-8,-8) ドットずれる */
  205.     p->core_y = p->y - 8;
  206.     if (player->y < p->y + 64)    /* 自機との座標の差が小さければ赤 */
  207.         p->core_info = PALET_CORE_RED | PRIORITY_BOSS;
  208.     else
  209.         p->core_info = PALET_CORE_BLUE | PRIORITY_BOSS;
  210.     xsp_set_st (&(p->core_x));
  211.  
  212.     return (0);
  213. }
  214.  
  215.  
  216.  
  217. static void EnemyTiniSword (ENEMY * p)
  218. {
  219.     entry_control -= ENTRY_CONTROL_ADD;
  220. }
  221.